/*===========================================================================*/
/**
 * @file sci_stdio.c
 *
 * @brief SCI STDIO重定向实现。
 *
 *------------------------------------------------------------------------------
 *
 * Copyright (C) 2025 Aptiv. All rights reserved.
 * Aptiv Sensitive Business - Restricted Aptiv information. Do not disclose
 *
 *------------------------------------------------------------------------------
 *
 * @section DESC DESCRIPTION:
 *   - 本模块实现通过RTS库add_device机制，将标准输出(stdout)重定向到指定SCI外设，
 *     使得printf/puts等函数可直接输出到串口终端。
 *
 * @section ABBR ABBREVIATIONS:
 *   - SCI: Serial Communications Interface
 *   - STDIO: Standard Input/Output
 *
 * @section TRACE TRACEABILITY INFO:
 *   - Design Document(s):
 *     - SCI_STDIO适配设计文档 v1.0
 *   - Requirements Document(s):
 *     - 详见系统串口适配需求章节
 *   - Applicable Standards:
 *     - ESGW_4-2_PE-SWx_00-01-A02_EN - C Coding Standards [20120506]
 *
 * @section DFS DEVIATIONS FROM STANDARDS:
 *   - None.
 */
/*==========================================================================*/

/*===========================================================================*
 * Standard Header Files
 *===========================================================================*/
#include "sci_stdio.h"
#include <stdio.h>
#include <file.h>
#include <assert.h>
#include <stdbool.h>

/*===========================================================================*
 * Other Header Files
 *===========================================================================*/
#include "hal_sci.h"

/*===========================================================================*
 * Local Preprocessor #define Constants
 *===========================================================================*/

/*===========================================================================*
 * Local Preprocessor #define MACROS
 *===========================================================================*/

/*===========================================================================*
 * Local Type Declarations
 *===========================================================================*/

/*===========================================================================*
 * Exported Object Definitions
 *===========================================================================*/

/*===========================================================================*
 * Local Object Definitions
 *===========================================================================*/
/** SCI基地址，仅支持单实例STDOUT重定向 */
static uint32_t g_sci_base = 0;

/*===========================================================================*
 * Local Function Prototypes
 *===========================================================================*/
static void sci_stdio_putchar(uint8_t ch);

/*===========================================================================*
 * Local Inline Function Definitions and Function-Like Macros
 *===========================================================================*/

/*===========================================================================*
 * Function Definitions
 *===========================================================================*/

/**
 * @brief 低层发送单字节到SCI
 */
static void sci_stdio_putchar(uint8_t ch)
{
    hal_sci_send_byte(g_sci_base, ch);
}

/**
 * @brief add_device标准接口
 */
int SCI_open(const char *path, unsigned flags, int llv_fd)
{
    // 仅支持写
    if (!(flags & O_WRONLY)) return -1;
    // 已在外部初始化
    return 1;
}

int SCI_close(int dev_fd)
{
    return 0;
}

int SCI_read(int dev_fd, char *buf, unsigned count)
{
    // 只支持写
    return -1;
}

int SCI_write(int dev_fd, const char *buf, unsigned count)
{
    for (unsigned i = 0; i < count; i++) {
        sci_stdio_putchar(buf[i]);
    }
    return count;
}

off_t SCI_lseek(int dev_fd, off_t offset, int origin)
{
    return -1;
}

int SCI_unlink(const char *path)
{
    return -1;
}

int SCI_rename(const char *old_name, const char *new_name)
{
    return -1;
}

/**
 * @brief SCI标准输出重定向初始化
 */
void sci_stdio_init(uint32_t base)
{
    g_sci_base = base;

    add_device("sci", _SSA, SCI_open, SCI_close, SCI_read, SCI_write,
               SCI_lseek, SCI_unlink, SCI_rename);
    // 重定向stdout
    assert(freopen("sci:", "w", stdout) != NULL);
    setvbuf(stdout, NULL, _IONBF, 0); // 关键：设置为无缓冲
}

/*============================================================================*\
 * AUTHOR(S) IDENTITY (AID)
 *-----------------------------------------------------------------------------
 *  XG   Xianzhi Gong   njp4bz
\*============================================================================*/

/*============================================================================*\
 * FILE REVISION HISTORY
 *-----------------------------------------------------------------------------
 *  DATE        REVISION   AID   JIRA Ticket ID/SUMMARY OF CHANGES
 *  ---------------------------------------------------------------------------
 *  2025-05-28  1.00       XG    Initial version (template-style)
 *  ---------------------------------------------------------------------------
\*============================================================================*/

/* END OF FILE -------------------------------------------------------------- */
